การอัปเดต SPICE ของ QuickSight จาก Lambda function เมื่อ Glue Crawler ทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว
บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า Glue Crawler のクローリングが完了したら Lambda function から QuickSight の SPICE を更新する โดยเจ้าของบทความนี้คือ คุณ Yuta Shimizu
จุดประสงค์
ในบทความนี้เราจะสร้างการกำหนดค่าที่อัปเดต SPICE ของ QuickSight ที่จะทำงานหลังจาก Glue Crawler ทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว
บทความนี้อ้างอิงจากบล็อกของทาง AWS Event-driven refresh of SPICE datasets in Amazon QuickSight [1]
โดยบทความนี้จะคล้ายกับบทความก่อนหน้า แต่จะมีการอัปเดตเนื้อหา SPICE ของ QuickSight หลังจากการรวบรวมข้อมูลเสร็จสิ้นเพิ่มเข้ามา
ซึ่งในบทความนี้จะมีแผนผังการตั้งค่าตามนี้
ใน Step 1 -2 ของแผนภาพจะคล้ายกับบทความด้านบน และถึงแม้ว่าส่วนใหญ่เราจะใช้คำสั่ง CDK แต่ QuickSight ยังคงต้องใช้ CLI กับ Management console ในการตั้งค่า
อย่างไรก็ตาม เราสามารถสร้างการตั้งค่าเดียวกันนี้ใน Management console และอัปเดต SPICE โดยอัตโนมัติหลังจากทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว
ข้อกำหนดเบื้องต้น/สิ่งที่ต้องรู้
- บัญชี AWS ที่มีการตั้งค่า QuickSight เรียบร้อยแล้ว
- สิทธิในการสร้าง IAM Role, Policy และ Cloud9
- คำสั่ง cdk bootstrap ที่ถูกรันใน region ที่เราต้องการใช้งาน
- วิธีการสร้าง IAM Role และ Policy และการใช้ AWS CLI
Step 1: เตรียมสภาพแวดล้อมใน Cloud9 สำหรับการใช้งาน CDK
เริ่มจากการสร้าง role เพื่อนำไปใช้กับ EC2 instance ที่ใช้งาน Cloud9
โดย role นั้นจะประกอบไปด้วย policy ตามด้านล่าง
Note: ในการใช้งานจริงควรตั้งค่าให้สิทธิ์ตามหลัก least privilege
- AWSCloud9SSMInstanceProfile: เพื่อเชื่อมต่อไปยัง Cloud9 ผ่านทาง Session Manager
- AmazonS3FullAccess: สำหรับการอัปโหลดและลบไฟล์ใน Amazon S3
- Inline Policy ตามด้านล่างนี้: เพื่อให้มีสิทธิ์ในการ deploy CDK และเริ่มใช้งาน AWS Glue Crawler, QuickSight และ CloudFormation Stacks สำหรับการค้นหาและตรวจสอบ event ที่เกิดขึ้น
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/cdk-*" ] }, { "Sid": "StartCrawler", "Effect": "Allow", "Action": [ "glue:StartCrawler" ], "Resource": [ "*" ] }, { "Sid": "CfnDescribe", "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks" ], "Resource": [ "*" ] }, { "Sid": "QS", "Effect": "Allow", "Action": [ "quicksight:*" ], "Resource": [ "*" ] } ] }
จากนั้นสร้าง Cloud9 และติดตั้ง role ไปที่ EC2 instance โดยอิงจากบทความด้านล่าง
Step 2: สร้าง resource ต่างๆที่นอกเหนือจาก QuickSight
เข้าไปที่ Cloud9 แล้วใช้คำสั่งตามด้านล่าง เพื่อโคลนโปรเจกต์ตาม ลิงก์ และติดตั้งแพ็คเกจที่จำเป็น
git clone https://github.com/yuta-cmth/blog-glue-trigger-refresh-qs-spice.git cd blog-glue-trigger-refresh-qs-spice npm i
หลังจากที่กำหนดตัวแปรที่ใช้ CDK แล้ว
ให้สร้าง resources โดยใช้คำสั่ง CDK
# กำหนด dataset id ของ QuickSight และการสร้าง resource export QS_DATA_SET_ID='blog-glue-trigger-refresh-qs-spice-dataset' cdk deploy --require-approval never
หลังจากใช้คำสั่งด้านบนจะได้ผลลัพธ์ตามนี้
✨ Total time: 133.24s
เก็บรายชื่อ resource จาก CloudFormation (S3 bucket, Glue Crawler และ Athena work group) ไว้ในตัวแปรโดยใช้คำสั่งด้านล่าง
bucket_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerBucketName`].OutputValue') crawler_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerName`].OutputValue') athena_work_group_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueAthenaWorkGroupName`].OutputValue')
จากนั้นใช้คำสั่งตามด้านล่างนี้ เพื่ออัปโหลดไฟล์ไปที่ S3 และเรียกใช้ Glue Crawler
aws s3 cp ./s3_test_data/data/test1 "s3://${bucket_name}/data/test1" aws glue start-crawler --name "${crawler_name}"
ข้อมูลของไฟล์ s3_test_data/data/test1 ที่ถูกอัปโหลดจะประกอบไปด้วยข้อมูลตามด้านล่างและจะถูกนำไปใช้ใน QuickSight ภายหลัง
{"timestamp": "2024-01-01 00:00:00", "metric1": 1, "dimension1": "foo"} {"timestamp": "2024-01-01 00:00:00", "metric1": 3, "dimension1": "bar"} {"timestamp": "2024-01-01 00:01:00", "metric1": 1, "dimension1": "foo"} {"timestamp": "2024-01-01 00:01:00", "metric1": 1, "dimension1": "bar"}
Step 3: สร้าง QuickSight
ตั้งแต่ขั้นตอนนี้ไป เราจะใช้ทั้ง CLI และ Management console
เริ่มด้วยการให้สิทธิ์ QuickSight เพื่อเข้าถึง S3 ที่สร้างจากคำสั่ง CDK
คลิก Manage QuickSight
ที่ด้านบนขวาของ management console จากนั้นคลิก Security & permissions
⚠️ เราอาจจะต้องเปลี่ยน region เพื่อตรวจสอบ Security & permissions ขึ้นอยู่กับการตั้งค่าใน QuickSight
ซึ่งในบทความนี้เราจะตั้ง region เป็น N.Virginia จากนั้นคลิก Manage QuickSight
คลิกที่ Manage
เพื่อตั้งค่าให้ QuickSight เข้าถึงบริการต่างๆของ AWS
อนุญาตให้เข้าถึง S3 bucket ที่ถูกสร้างด้วย CDK จากนั้นให้กลับไปที่ region เดิม
การอนุญาตนี้จะทำให้ QuickSight สามารถ query ข้อมูลจาก S3 โดยการใช้ Athena ได้
ต่อไปให้ใช้คำสั่งนี้ใน Cloud9 เพื่อรับ ID จากบัญชี AWS
export AAI=$(aws sts get-caller-identity --query "Account" --output text)
จากนั้นใน management console ให้คัดลอก username ของ QuickSight โดยอยู่ที่มุมบนขวาตามรูปด้านล่าง
ใช้คำสั่งตามนี้ เพื่อใส่ username ของ QuickSight ไว้ในตัวแปร
# หลังจากใช้คำสั่งนี้แล้ว ให้ใส่ username ที่เพิ่งคัดลอกมา จากนั้นกด Enter read -s QUICKSIGHT_USERNAME; export QUICKSIGHT_USERNAME
ต่อจากนี้ไปเราจะสร้าง resource ทั้งหมดของ QuickSight โดยใช้ CLI
โดยเราสามารถสร้าง Dataset ด้วยการใช้ CLI หรืออีกวิธีคือสร้างด้วย management console และอัปเดต SPICE จาก Lambda
ซึ่งเราจะสร้าง resource 4 อย่างประกอบด้วย data source, dataset, analysis และ dashboard ด้วยขั้นตอนดังต่อไปนี้
1. ใช้ไฟล์ jsonnet ประกอบกันเพื่อสร้างไฟล์ JSON ที่กำหนดค่า resource ของ QuickSight
2. สร้าง resource ของ QuickSight ด้วย aws quicksight create- --cli-input-json
ไฟล์ JSON ถูกสร้างขึ้นโดยอิงตามบทความนี้[2]
เริ่มด้วยการสร้าง data source โดยการเปลี่ยนพื้นที่เก็บ qs_jsonnet/create-data-source.jsonnet ให้เป็น JSON ด้วย jsonnet
แล้วให้ jsonnet อนุญาตให้ใช้ตัวแปร ดังนั้นเราจึงสามารถใส่ค่าที่หลากหลายซึ่งขึ้นอยู่กับ environment (อย่างเช่น ID ของ AWS) ลงไปในตัวแปร
เนื่องจาก jsonnet ไม่สามารถอ่านตัวแปรสภาพแวดล้อม ดังนั้นเราจึงใช้อาร์กิวเมนต์ --ext-str เพื่อส่งผ่านค่า
docker run \ -v $(pwd):/app \ -w /app \ bitnami/jsonnet:latest \ --ext-str "AWS_ACCOUNT_ID=$AAI" \ --ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \ --ext-str "ATHENA_WORKGROUP=$athena_work_group_name" \ qs_jsonnet/create-data-source.jsonnet > jsonnet.out/create-data-source.json aws quicksight create-data-source --cli-input-json file://jsonnet.out/create-data-source.json
สร้าง dataset, analysis และ dashboard โดยใช้วิธีเดียวกัน
# สร้าง dataset docker run \ -v $(pwd):/app \ -w /app \ bitnami/jsonnet:latest \ --ext-str "AWS_ACCOUNT_ID=$AAI" \ --ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \ --ext-str "DATA_SET_ID=$QS_DATA_SET_ID" \ qs_jsonnet/create-data-set.jsonnet > jsonnet.out/create-data-set.json aws quicksight create-data-set --cli-input-json file://jsonnet.out/create-data-set.json # สร้าง analysis docker run \ -v $(pwd):/app \ -w /app \ bitnami/jsonnet:latest \ --ext-str "AWS_ACCOUNT_ID=$AAI" \ --ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \ qs_jsonnet/create-analysis.jsonnet > jsonnet.out/create-analysis.json aws quicksight create-analysis --cli-input-json file://jsonnet.out/create-analysis.json # สร้าง dashboard docker run \ -v $(pwd):/app \ -w /app \ bitnami/jsonnet:latest \ --ext-str "AWS_ACCOUNT_ID=$AAI" \ --ext-str "QUICKSIGHT_USERNAME=$QUICKSIGHT_USERNAME" \ qs_jsonnet/create-dashboard.jsonnet > jsonnet.out/create-dashboard.json aws quicksight create-dashboard --cli-input-json file://jsonnet.out/create-dashboard.json
ตรวจสอบที่หน้าจอ QuickSight ของ management console เพื่อดู resource ที่เราสร้าง
blog-glue-trigger-refresh-qs-spice ถูกสร้างไว้ที่ dataset
analysis จะถูกสร้างไว้ที่ Analyzes โดยมีชื่อเหมือนกับ dataset
และ dashboard ก็ถูกสร้างไว้ที่ Dashboards
ตอนนี้ resource ที่จำเป็นก็พร้อมใช้งานแล้ว
Step 4: ใช้งาน Glue Crawler เพื่อตรวจสอบว่า SPICE มีการอัปเดต
เริ่มจากใช้คำสั่งนี้ใน Cloud9 เพื่อสร้างไฟล์ใน S3 และเรียกใช้งาน Glue Crawler
aws s3 cp ./s3_test_data/data/test2 "s3://${bucket_name}/data/test2" aws glue start-crawler --name "${crawler_name}"
เมื่อรวบรวมข้อมูลเรียบร้อยแล้ว EventBridge จะเรียก Lambda โดยอิงตามไฟล์นี้ ใน Lambda นี้ SPICE จะถูกอัปเดตโดยใช้ SDK ของ QuickSight อย่างที่แสดงด้านล่าง
response = quicksight.create_ingestion(AwsAccountId=account_id, DataSetId=data_set_id, IngestionId=ingestion_id)
จากนั้นในหน้า management console คลิก QuickSight
> Datasets
> blog-glue-trigger-refresh-qs-spice
> Refresh
ซึ่งจะใช้เวลาประมาณ 1 นาทีในการประมวลผล
เมื่อรวบรวมข้อมูลเสร็จแล้ว Refresh จะปรากฏตามรูปด้านล่าง
ทันทีที่ Refresh เรียบร้อยแล้ว ให้ตรวจสอบที่ Dashboard
เมื่อมีการอัปเดต SPICE ข้อมูลที่แสดงใน Dashboard ก็จะอัปเดตเช่นกันตามรูปด้านล่าง
Step 5: ลบ resource
ลบ resource ทีละรายการโดยใช้คำสั่งต่อไปนี้สำหรับส่วนที่ถูกสร้างด้วย CDK และส่วนที่ยังไม่เปิดใช้งาน
# ลบ resource ทั้งหมดใน QuickSight aws quicksight delete-dashboard --aws-account-id $AAI --dashboard-id blog-glue-trigger-refresh-qs-spice-dashboard aws quicksight delete-analysis --aws-account-id $AAI --analysis-id blog-glue-trigger-refresh-qs-spice-analysis aws quicksight delete-data-set --aws-account-id $AAI --data-set-id blog-glue-trigger-refresh-qs-spice-dataset aws quicksight delete-data-source --aws-account-id $AAI --data-source-id blog-glue-trigger-refresh-qs-spice-data-source # ลบไฟล์ทั้งหมดใน S3 bucket เพื่อให้ CDK สามารถลบ S3 ได้ aws s3 rm "s3://${bucket_name}" --recursive cdk destroy --force
สรุป
ในบทความนี้ เราได้อธิบายการกำหนดค่าเพื่ออัปเดต SPICE ของ QuickSight หลังจากที่ AWS Glue Crawler ทำการรวบรวมข้อมูลและการสร้างตารางเสร็จแล้ว
หวังว่าบทความนี้จะสามารถนำไปประยุกต์ใช้กับการพัฒนาโปรเจกต์ต่างๆได้ครับ
บทความต้นฉบับ
Glue Crawler のクローリングが完了したら Lambda function から QuickSight の SPICE を更新する(ภาษาญี่ปุ่น)
บทความที่เกี่ยวข้อง
- บทความที่ [1] Event-driven refresh of SPICE datasets in Amazon QuickSight(ภาษาอังกฤษ)
- บทความที่ [2] Amazon QuickSight. (n.d.). All Aspects [QuickSight Workshops](ภาษาอังกฤษ)